package treeInspector;

import java.io.*;
import java.util.*;

import javax.sound.sampled.AudioSystem;
//import javax.sound.sampled.UnsupportedAudioFileException;

public class FileOperator {
	
	private LinkedList<String> arborescence;
	private String logErreur = "logErreurMusiques.txt";
	
	/*
	 * Fonction retournant l'arborescence d'un chemin donne sur le disque sous la
	 * forme d'une liste contenant le chemin absolu de chaques fichiers, suivi du
	 * caractere '%' precedant leur taille.
	 *
	 * Parametre - cheminComplet : Chemin absolu ou relatif a analyser.
	 * Retour    - LinkedList<String> Arborescence complete du dossier
	 */
	protected LinkedList<String> obtenirArborescence(String cheminComplet) throws IOException {
		arborescence = new LinkedList<String>();
		File f = new File(cheminComplet);
		creerArborescence(f);
		return arborescence;
	}

	/*
	 * Methode permettant d'obtenir les elements present dans une liste de chaine
	 * de caractere qui ne le sont pas dans la liste de reference. La structure
	 * du rendu est identique au rendu d'une arborescence complete.
	 *
	 * Parametres - listeAnalysee    : Nouvelle liste analysee
	 *            - listeDeReference : Liste servant de reference.
	 * Retour     - LinkedList<String> Nouveaux elements
	 */
	protected LinkedList<String> obtenirNouvellesInformations(
			LinkedList<String> listeAnalysee,
			LinkedList<String> listeDeReference) {

		LinkedList<String> resultat = new LinkedList<String>();
		ListIterator<String> j = listeAnalysee.listIterator();

		String courantA;


		while (j.hasNext()) {
			courantA = j.next();
			if (!listeDeReference.contains(courantA)) {
				resultat.add(courantA);
			}
		}

		return resultat;
	}


	/*
	 * Methode permettant le stockage d'une Liste de chaine de caracteres dans un
	 * fichier texte sur le disque.
	 *
	 * Parametres - liste         : Liste devant etre enregistre
	 *            - cheminComplet : Chemin absolu ou relatif sur le disque ou
	 *                              l'on doit enregistrer la liste
	 * Exception : IOException peut etre levee si le chemin n'as pu etre trouve
	 *             ou en cas d'erreur lors de l'ecriture.
	 */
	protected void enregistrerListe(LinkedList<String> liste,
			String cheminComplet) throws IOException {

		// Creation d'un flux sur un nouveau fichier
		FileWriter writer = new FileWriter(cheminComplet);

		// Parcourt de la liste et remplissage du fichier
		ListIterator<String> i = liste.listIterator();
		while (i.hasNext()) {
			writer.write(i.next() + "\n");
		}

		// Fermeture du fichier
		writer.close();

	}

	/*
	 * Methode permettant d'extraire dans une liste chainee les lignes d'un
	 * fichier texte.
	 *
	 * Parametres - cheminComplet : Chemin absolu ou relatif sur le disque ou
	 *                              est enregistre la liste
	 * Retour     - LinkedList<String> : liste contenant le fichier lignes par
	 *                                   lignes
	 */
	protected LinkedList<String> listerLigneFichier(String cheminComplet)
			throws IOException {

		// Creation du flux de lecture sur le fichier
		BufferedReader buff = new BufferedReader(
				new FileReader(cheminComplet));

		String line;
		LinkedList<String> list = new LinkedList<String>();

		// Lecture de toutes les lignes du fichier
		while ((line = buff.readLine()) != null) {
			list.add(line);
		}

		// Fermeture du flux
		buff.close();

		return list;
	}

	/*
	 * Methode retournant l'arborescence d'un fichier donne, liste recursivement.
	 *
	 * Parametre - repertoire : Chemin absolu ou relatif sur le disque que l'on
	 *                          doit analyser.
	 */
	private void creerArborescence(File repertoire) throws IOException {
		
		// Ajout du repertoire ou du fichier dans la liste
		if(!repertoire.isDirectory()) {
			// Test de la musique.
			try {
				AudioSystem.getAudioInputStream(repertoire);
				arborescence.add(repertoire.getCanonicalPath());
			} catch (Exception e) {
				
				// Creation d'un flux sur le fichier de log d'erreur
				FileWriter writer = new FileWriter(logErreur,true);
				writer.write(repertoire.getCanonicalPath() + "\n");
				// Fermeture du fichier
				writer.close();
			}
		}


		// Liste des sous repertoires/fichiers contenus
		if (repertoire.isDirectory()) {
			File[] list = repertoire.listFiles();
			if (list != null) {
				// Parcours des dossiers/Fichiers
				for (int i = 0; i < list.length; i++) {
					// Descendre dans l'arborescence
					creerArborescence(list[i]);
				}
			}
		}
	}
}
